#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h> //using for IPPROTO_UDP
#include <arpa/inet.h>  //using for inet_addr()、htons()、htonl()

int main()
{
    // 1.创建套接字
    // int sock_fd = socket(AF_INET, SOCK_DGREAM, 2);
    int sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(sock_fd < 0)
    {
        perror("socket");
        return 0;
    }

    /* 测试创建套接字接口socket
     * tip: ll /proc/<pid>/fd 指令可以查看该进程的IO文件套接字
     *
    printf("sockfd is :%d\n", sock_fd);
    while(1)
    {
        sleep(2);
    }
    */

    // 2.绑定地址信息
    //  (1)创建地址信息结构体
    //      a.创建struct sockaddr_in类型的结构体，再强转为通用类型struct sockaddr
    //      b.添加源ip，需使用接口：
    //          in_addr_t inet_addr("") <arpa/inet.h>
    //              i :将点分十进制转换为无符号的32位整型
    //              ii:将ip的主机字节序转为网络字节序
    //          tip：natstat -anp | grep <端口号/文件名> 查看对应的端口/进程的网络状态
    //      c.添加源port，需使用接口
    //          htons() <arpa/inet.h>
    //              源port从主机字节序转为网络字节序
    //      d.源ip一定是私网ip
    //
    //  (2)调用bind接口，注意第二个参数传地址(struct sockaddr*)

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(28989);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //注意：源IP一定是私网IP

    int ret = bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret < 0)
    {
        perror("bind");
        return 0;
    }
    printf("sockfd is :%d\n", sock_fd);
    while(1)
    {
        sleep(2);
    }
    return 0;
}
